﻿#include "stylehandler.h"

#include <QDebug>
#include <QApplication>
#include <QDir>
#include <QFile>

namespace Common {

class StyleHandlerPrivate
{
    Q_DECLARE_PUBLIC(StyleHandler)

public:
    StyleHandlerPrivate(StyleHandler * q)
        : q_ptr(q)
    {

    }

    StyleHandler * q_ptr;            //
    StylePtrList slist;             // 样式表列表
    CustomStyle * currStyle;        // 当前样式表
};

StyleHandler::StyleHandler()
    : QObject()
    , d_ptr(new StyleHandlerPrivate(this))
{

}

StyleHandler::~StyleHandler()
{

}

void StyleHandler::addStyle(CustomStyle *style)
{
    Q_D(StyleHandler);
    d->slist.push_back(style);
}

bool StyleHandler::dynamicLoadStyle(QString stylePath)
{
    if(stylePath.isEmpty())
        return false;

    stylePath.replace("/","\\");
    QFileInfo fileInfo(stylePath);
    if(!fileInfo.isDir())
        return false;

    QDir styleDir(stylePath);
    QFileInfoList styleInfoList = styleDir.entryInfoList(QDir::Dirs);

    std::for_each(styleInfoList.begin(),styleInfoList.end(),[&](QFileInfo & fileInfo)
    {
        if(isValidStyleDir(fileInfo.absoluteFilePath()))
        {
            addStyle(new CustomStyle(fileInfo.fileName(), getStyleFile(fileInfo.absoluteFilePath()), false));
        }
    });
    return true;
}

int StyleHandler::size()
{
    Q_D(StyleHandler);
    return d->slist.size();
}

StylePtrList StyleHandler::styles()
{
    Q_D(StyleHandler);
    return d->slist;
}

bool StyleHandler::switchStyle(int index)
{
    Q_D(StyleHandler);
    Q_ASSERT(index < d->slist.size());
    d->currStyle = d->slist.at(index);

    switch(d->currStyle->getStyleType())
    {
    // 样式表文件
    case CustomStyle::STYLE_SHEET:
    {
        QFile styleFile(d->currStyle->getStylePath());
        if(!styleFile.open(QFile::ReadOnly))
        {
            qWarning("style file %s read error!",d->currStyle->getStylePath().toLocal8Bit().data());
            return false;
        }
        qApp->setStyleSheet(styleFile.readAll());
        break;
    }
        // 自定义样式
    case CustomStyle::STYLE_CUSTOMSTYLE:
    {
        switch(d->currStyle->getClazz())
        {
        //                qApp->setStyle();
        default:
            break;
        }
        break;
    }
    default:
        break;
    }
    return true;
}

CustomStyle * StyleHandler::currentStyle()
{
    Q_D(StyleHandler);
    return d->currStyle;
}

CustomStyle *StyleHandler::findStyle(QString styleName)
{
    Q_D(StyleHandler);
    for(int i = 0; i < d->slist.size(); i++)
    {
        if(d->slist.at(i)->getStyleName() == styleName)
        {
            return d->slist.at(i);
        }
    }
    return NULL;
}

/*!
 * @brief 检测传递的路径是否符合标准的样式结构
 * @warning 目录结构必须严格遵守以下路径格式：
 *          [+]dark:
 *                [+]img:【可选】
 *                [+]qss:【必须】
 *                   [-]style.qss:【必须】
 * @param[in] singleStyleDir 待检测的样式路径
 * @return true：符合标准
 */
bool StyleHandler::isValidStyleDir(QString singleStyleDir)
{
    QFileInfo styleInfo(getStyleFile(singleStyleDir));
    return styleInfo.exists();
}

QString StyleHandler::getStyleFile(QString styleRootPath)
{
    return QString(styleRootPath + QDir::separator()+ QString("qss/style.qss"));
}

}// namespace Common
